package br.lelu;

import java.io.FileNotFoundException;
import java.io.IOException;

import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class AppLelu extends Activity implements OnClickListener {

	private Button btSalvar, btAbrir, btCompilar, btNovo;// variaveis de botoes
	private ManageFile managefile;// variavel para menipular arquivos
	private EditText txtCodigo, projectNome;// variaveis para editText
	private TextView console;// variavel pra TextView
	private String nome = "";// variavel String para o nome do projeto.

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// define o layout da janela main
		setContentView(R.layout.main);
		// recupera a ActionBar
		ActionBar actionBar = getActionBar();
		// set um cunston layout para ActionBar
		actionBar.setCustomView(R.layout.actionbar_view);
		// torna a ActioBar com layout customizado visivel
		actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
				| ActionBar.DISPLAY_SHOW_HOME);
		// faz o link do txtCodigo entra o java e o xml
		txtCodigo = (EditText) findViewById(R.id.txtCodigo);
		// faz o link do projectName entra o java e o xml
		projectNome = (EditText) findViewById(R.id.actionBarTxtProjeto);
		// faz o link do btAbrir entra o java e o xml
		btAbrir = (Button) findViewById(R.id.actionBarAbrir);
		// faz o link do btSalvar entra o java e o xml
		btSalvar = (Button) findViewById(R.id.actionBarSalvar);
		// faz o link do btCompilar entra o java e o xml
		btCompilar = (Button) findViewById(R.id.actionBarCompilar);
		// faz o link do btNovo entra o java e o xml
		btNovo = (Button) findViewById(R.id.actionBarNovo);
		// faz o link do console entra o java e o xml
		console = (TextView) findViewById(R.id.tvConsole);
		// estancia managefile
		managefile = new ManageFile(AppLelu.this);
		// busca estado do SD
		managefile.getStateSDcard();
		//acoes dos botoes.
		btAbrir.setOnClickListener(this);
		btCompilar.setOnClickListener(this);
		btNovo.setOnClickListener(this);
		btSalvar.setOnClickListener(this);

	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.actionBarAbrir:
			abrirProjeto();
			break;
		case R.id.actionBarCompilar:
			compilarProjeto();
			break;
		case R.id.actionBarNovo:
			novoProjeto();
			break;
		case R.id.actionBarSalvar:
			salvarProjeto();
			break;
		default:
		}
	}

	/******************* Criacao dos menus *****************/
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.mainmenu, menu);
		return true;
	}

	/******************* Metodo para ler as opcoes de menu *****************/
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case R.id.menuAbrir:
			abrirProjeto();
			break;
		case R.id.menuSalvar:
			salvarProjeto();
			break;
		case R.id.manuCompilar:
			compilarProjeto();
			break;
		case R.id.actionBarNovo:
			novoProjeto();
			break;
		case android.R.id.home:
			Intent intent = new Intent(this, AppLelu.class);
			intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			startActivity(intent);
			break;
		}
		return true;
	}

	/************ Metodo que pede o nome do projeto quando nao especificado ********/
	public Dialog pedirNome() {
		final Dialog d = new Dialog(this);
		d.setContentView(R.layout.diaologonovoprojeto);
		d.setTitle(R.string.titulo_aviso);

		final EditText edit = (EditText) d.findViewById(R.id.txtProjeto);
		final Button bt = (Button) d.findViewById(R.id.btDialogo);

		bt.setOnClickListener(new View.OnClickListener() {

			public void onClick(View p1) {
				nome = edit.getText().toString();
				projectNome.setText(nome);
				d.dismiss();
			}
		});
		return d;
	}

	/************ Metodo para abrir projetos ********/
	public void abrirProjeto() {

		console.setText("");
		if ((!projectNome.getText().toString().isEmpty())
				&& (!projectNome.getText().toString().equals(""))) {
			try {
				if (managefile.isSdCardAvailable()
						&& (managefile.isSdCardReadableOnly() || managefile
								.isSdCardWritableReadable())) {
					managefile.getStateSDcard();
					txtCodigo.setText(managefile.ReadFile(projectNome.getText()
							.toString()));
				} else {
					Toast.makeText(getBaseContext(), R.string.erro_leitura_sd,
							Toast.LENGTH_SHORT).show();
				}

			} catch (FileNotFoundException e) {
				Toast.makeText(getBaseContext(), R.string.erro_abrir_projeto,
						Toast.LENGTH_SHORT).show();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			pedirNome().show();
		}
	}

	/************ Metodo para salvar projetos ********/
	public void salvarProjeto() {

		console.setText("");
		nome = projectNome.getText().toString();
		if ((!projectNome.getText().toString().isEmpty())
				&& (!projectNome.getText().toString().equals(""))) {
			if (managefile.isSdCardAvailable()
					&& managefile.isSdCardWritableReadable()) {
				managefile.WriteFile(txtCodigo.getText().toString(),
						projectNome.getText().toString());
			} else {
				Toast.makeText(getBaseContext(), R.string.erro_escrita_sd,
						Toast.LENGTH_SHORT).show();
			}
		} else {
			pedirNome().show();
		}
	}

	/************ Metodo para criar novos projetos ********/
	public void novoProjeto() {

		final Dialog d = new Dialog(AppLelu.this);
		d.setContentView(R.layout.diaologonovoprojeto);
		d.setTitle(R.string.titulo_aviso);
		final EditText edit = (EditText) d.findViewById(R.id.txtProjeto);
		final Button bt = (Button) d.findViewById(R.id.btDialogo);
		console.setText("");

		bt.setOnClickListener(new View.OnClickListener() {
			public void onClick(View p1) {
				nome = edit.getText().toString();
				projectNome.setText(nome);
				if ((nome.isEmpty()) || (nome.equals(""))) {
					AlertDialog.Builder dialogo = new AlertDialog.Builder(
							AppLelu.this);
					dialogo.setTitle(R.string.titulo_aviso);
					dialogo.setMessage(R.string.erro_nome_invalido);
					dialogo.setNeutralButton(R.string.ok,
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int which) {
									novoProjeto();
								}

							});
					dialogo.show();
					d.dismiss();
				} else {
					txtCodigo.setText("program "
							+ nome.replace(" ", "_").toUpperCase() + ";\n\n\n"
							+ "\tbegin\n\n\t\t\n\n" + "\tend.");
					txtCodigo.setSelection(nome.length() + 22);
					d.dismiss();
				}

			}
		});
		d.show();
	}

	/************ Metodo para compilar projetos ********/
	public void compilarProjeto() {
		console.setText("");
		Compilador compilar = new Compilador(this, console);
		compilar.compilar(txtCodigo.getText().toString());
	}

	/************ Metodo para exibir erro na criacao/abertura de projetos ********/
	public void erroNovoProjeto() {
		AlertDialog.Builder dialogo = new AlertDialog.Builder(AppLelu.this);
		dialogo.setTitle(R.string.titulo_aviso);
		dialogo.setMessage(R.string.erro_nome_invalido);
		dialogo.setNeutralButton(R.string.ok,
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {

					}

				});
		dialogo.show();
		novoProjeto();
	}

}
